const path = require('path');
const fs = require('fs');
const xlsx = require('xlsx');
const checkParams = (list: any) => {
	/**
	*
@param list excel表格数据
@description 验证表格数据
3、帐号、姓名、部门是必填项，密码、手机、邮箱是选填项；
4、帐号：必填项，长度不超过20个字符，只允许输入字母、数字、点、减号、下划线、@字符，首字符需要为字母或数字；
5、密码：8-16位，大小写字母、数字或符号3种组合，未输入则导入为随机密码；
6、姓名：必填项，长度不超过30个字符，不能包含特殊字符! @#$^*<>?；
7、手机：长度为11个数字，必须是正确的手机号格式；
8、邮箱：长度不超过80个字符，必须是正确的邮箱格式；
9、部门：必填项，上下级部门间使用"/"隔开，请从根部门（即企业名）开始填写；多部门的情况下，不同部门之间用"|"做分隔；单个部门名称长度不能超过40个字符，不能包含特殊字符\/:*?"<>|
	 */
	// 验证帐号
	let isPass = true;
	let errMessage = '';
	try {
		for (let index = 0; index < list.length; index++) {
			const element = list[index];
			// 帐号
			if (!element['帐号（必填）']) {
				isPass = false;
				throw new Error(`第${index + 2}行帐号不能为空`);
			}
			if (element['帐号（必填）'].length > 20) {
				isPass = false;
				throw new Error(`第${index + 2}行帐号长度不能超过20个字符`);
			}
			if (!/^[a-zA-Z0-9\.\-\_\@]{1,20}$/.test(element['帐号（必填）'])) {
				isPass = false;
				throw new Error(`第${index + 2}行帐号只允许输入字母、数字、点、减号、下划线、@字符，首字符需要为字母或数字`);
			}
			// 密码
			if (element['密码'] && element['密码'].length > 16) {
				isPass = false;
				throw new Error(`第${index + 2}行密码长度不能超过16个字符`);
			}
			if (element['密码'] && !/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/.test(element['密码'])) {
				isPass = false;
				throw new Error(`第${index + 2}行密码8-16位，大小写字母、数字或符号3种组合`);
			}
			// 姓名
			if (!element['姓名（必填）']) {
				isPass = false;
				throw new Error(`第${index + 2}行姓名不能为空`);
			}
			if (element['姓名（必填）'].length > 30) {
				isPass = false;
				throw new Error(`第${index + 2}行姓名长度不能超过30个字符`);
			}
			if (!/^[^!@#$^*<>?]{1,30}$/.test(element['姓名（必填）'])) {
				isPass = false;
				throw new Error(`第${index + 2}行姓名不能包含特殊字符! @#$^*<>?`);
			}
			// 手机
			if (element['手机'] && element['手机'].toString().length !== 11) {
				isPass = false;
				throw new Error(`第${index + 2}行手机长度为11个数字`);
			}
			if (element['手机'] && !/^1[3456789]\d{9}$/.test(element['手机'])) {
				isPass = false;
				throw new Error(`第${index + 2}行手机必须是正确的手机号格式`);
			}
			// 邮箱
			if (element['邮箱'] && element['邮箱'].length > 80) {
				isPass = false;
				throw new Error(`第${index + 2}行邮箱长度不能超过80个字符`);
			}
			if (element['邮箱'] && !/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(element['邮箱'])) {
				isPass = false;
				throw new Error(`第${index + 2}行邮箱必须是正确的邮箱格式`);
			}
			// 部门
			if (!element['部门（必填）']) {
				isPass = false;
				throw new Error(`第${index + 2}行部门不能为空`);
			}
			if (!/^[^\/\:\*\?\"\<\>\|]{1,40}$/.test(element['部门（必填）'])) {
				isPass = false;
				throw new Error(`第${index + 2}行部门名称长度不能超过40个字符，不能包含特殊字符\/:*?"<>|`);
			}
			if (element['部门（必填）'].indexOf('|') !== -1) {
				let departmentList = element['部门（必填）'].split('|');
				for (let i = 0; i < departmentList.length; i++) {
					if (!/^[^\/\:\*\?\"\<\>\|]{1,40}$/.test(departmentList[i])) {
						isPass = false;
						throw new Error(`第${index + 2}行部门名称长度不能超过40个字符，不能包含特殊字符\/:*?"<>|`);
					}
				}
			}
			// 如果isPass为false，抛出错误,不再往下执行
			if (!isPass) {
				break;
			}
		}
	} catch (error: any) {
		// 返回错误
		errMessage = error.message;
	}
	// 返回验证结果
	return {
		isPass,
		errMessage
	};
}
export const parseExcelFile = (filePath: string) => {
	// 使用xlsx解析excel文件
	const workbook = xlsx.readFile(filePath);
	// 获取excel中所有表名
	const sheetNames = workbook.SheetNames;
	// 根据表名获取对应某张表
	const worksheet = workbook.Sheets[sheetNames[0]];
	// 将表中数据转换为json
	const list = xlsx.utils.sheet_to_json(worksheet);
	// 验证表格数据,如果验证不通过，抛出错误
	console.log(checkParams(list));
	if (checkParams(list)?.isPass === false) {
		return checkParams(list) as any;
	}
	// 处理数据为table需要的格式
	let tableList = [] as any[];
	list.forEach((item: any) => {
		let obj = {
			"name": item['姓名（必填）'],
			"password": item['密码'] || '',
			"username": item['帐号（必填）'],
			"phone": item['手机'] || '',
			"email": item['邮箱'] || '',
			"dept": item['部门（必填）'],
		}
		tableList.push(obj)
	})
	return tableList;
}